/**
 * sessionStorage帮助类
 * 可设置过期时间
 * @author 十一
 * @version v1.0
 * @type {{set(*, *, *, *): boolean, get(*): (string|*), clear(): void, remove(*): (string|boolean)}}
 */
const storage = {
	/**
	 * set 储存方法
	 * @param key 键
	 * @param value 值
	 * @param expired 过期时间（以分钟为单位）。不设置过期时间请传 0 或 null 或 undefined
	 * @param isToken 是否为Token
	 * @return {boolean} 返回存储成功或者失败；true || false
	 */
	set(key, value, expired, isToken) {
		try {
			let para = null;
			if (expired == null || expired === undefined || expired === 0) {
				para = {
					Data: value,
					Expired: 0
				};
				sessionStorage.setItem(key, JSON.stringify(para));
				return true;
			} else {
				if (isToken) {
					para = {
						Data: value,
						Expired: expired
					};
				} else {
					para = {
						Data: value,
						Expired: `${Date.now() + 1000 * 60 * expired}`
					};
				}
				sessionStorage.setItem(key, JSON.stringify(para));
				return true;
			}
		} catch (e) {
			return false;
		}
	},

	/**
	 * get 获取方法
	 * @param key 键
	 * @return {string|any} 当键值不存在或已过期时返回相应提示信息，反之则返回键值对数据
	 */
	get(key) {
		try {
			if (sessionStorage.getItem(key)) {
				let data = JSON.parse(sessionStorage.getItem(key));
				if (data.Expired === 0) {
					return JSON.parse(data.Data);  // 没有设置过期时间直接返回数据
				} else {
					const expired = parseInt(data.Expired) || Date.now + 1;
					const now = Date.now();
					// 判断数据是否过期
					if (now >= expired) {
						sessionStorage.removeItem(key);  // 过期删除
						return "该键值已过期" + key;
					} else {
						return JSON.parse(data.Data);
					}
				}
			} else {
				return "键值不存在：" + key;
			}
		} catch (e) {
			return e;
		}
	},

	/**
	 * remove 移除某个键值
	 * @param key
	 * @return {string|boolean} 移除成功返回 true，失败返回提示信息
	 */
	remove(key) {
		if (sessionStorage.getItem(key)) {
			sessionStorage.removeItem(key);
			return true;
		} else {
			return "键值不存在：" + key;
		}
	},

	/**
	 * clear 删除所有键值
	 */
	clear() {
		sessionStorage.clear();
	}
};

export default storage;//抛出 外部可以访问
